package com.example;
// 多态实现条件
/**
 * 父类Animal：定义动物的通用属性和行为
 */
class Animal {
    public String name;  // 动物名称属性

    /**
     * 构造方法：初始化动物的名称
     * @param name 动物名称
     */
    public Animal(String name) {
        this.name = name;  // 使用this关键字区分同名参数和成员变量
    }

    /**
     * 动物吃饭的通用方法（可被子类重写）
     */
    public void eat() {
        System.out.println(name + "动物吃饭！！！");  // 输出动物通用吃饭行为
    }
}

/**
 * 子类Dog：继承Animal类，表示狗这种特定动物
 */
class Dog extends Animal {
    /**
     * 狗的构造方法：通过super调用父类构造方法初始化name
     * @param name 狗的名字
     */
    public Dog(String name) {
        super(name);  // 必须调用父类构造方法（因为父类没有默认无参构造方法）
    }

    /**
     * 重写父类的eat()方法：实现狗特有的吃饭行为
     */
    @Override
    public void eat() {
        System.out.println(name + "吃骨头！！！");  // 狗特有的吃饭行为：吃骨头
    }
}

/**
 * 子类Cat：继承Animal类，表示猫这种特定动物
 */
class Cat extends Animal {
    /**
     * 猫的构造方法：通过super调用父类构造方法初始化name
     * @param name 猫的名字
     */
    public Cat(String name) {
        super(name);  // 调用父类构造方法初始化name属性
    }

    /**
     * 重写父类的eat()方法：实现猫特有的吃饭行为
     * 多态：同一eat方法在不同子类中有不同实现
     */
    @Override
    public void eat() {
        System.out.println(name + "吃鱼！！！");  // 猫特有的吃饭行为：吃鱼
    }


    /**
     * 静态方法：接受Animal类型的参数（体现多态的核心）
     * 此方法可以处理任何Animal子类的对象，体现了多态的灵活性
     * @param a Animal类型的引用，可以指向任何Animal子类的对象
     */
    public static void eat(Animal a){
        a.eat();// 动态绑定：运行时根据实际对象类型决定调用哪个eat方法
    }
    public static void main(String[] args) {
        Dog dog = new Dog("旺财");  // 创建Dog对象，name初始化为"旺财"
        Cat cat = new Cat("咪咪");  // 创建Cat对象，name初始化为"咪咪"

        eat(dog);  // 方法传参时的向上转型：Dog → Animal，输出"旺财吃骨头！！！"
        eat(cat);  // 方法传参时的向上转型：Cat → Animal，输出"咪咪吃鱼！！！"
    }
}
/* 运行结果：
旺财吃骨头！！！
咪咪吃鱼！！！
*/